OpenGL - Les Textures

Définition

Une texture est un ensemble de pixels, de couleurs différentes, se regroupant pour appliquer une image sur une surface. En fait une texture est un tableau, et dans chaque case il y a une couleur. Je ne vais pas vous détailler l'exemple de l'échiquier que tout le monde reprend car vous ne vous en servirez jamais. Par contre je vais vous donner une librairie très pratique qui fait tout le travail, y a plus qu'à appliquer, en trois lignes de code c'est fait.

Les formats

Pour l'instant ne vous limitez pas au format des fichiers images. Utilisez une librairie comme Devil, ijl etc.. pour charger vos images en mémoire. Je ne detail pas ici ces librairies, toutefois vous trouverez sur glinfrench une présentation de devil.
Nous étudierons le format BMP un peu plus loin (section: opengl/chargeur bmp)

OpenGL à besoin d'un unsigned int pour stocker les textures en mémoire, enfin le nombre qui y sera stocké nous permet d'utiliser les textures que l'on crée, ou que l'on passe à opengl.

GLuint texture;

Ensuite en phase d'initialisation on génère une texture, de la maniere suivante:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexImage2D(GL_TEXTURE_2D, 0, channels, size, size, 0, type, GL_UNSIGNED_INT, pTexture);

glGenTexture génère un emplacement mémoire pour la texture. glBind assure que l'on effectue les calculs de texture dans notre texture. Et glTexImage2D passe toutes les données de l'image à opengl.

Attention glTexImage2D peut voir ses arguments changer (inversement des channel et du format) de la version 1.1 à la version 1.3 d'opengl, voir les docs en fonction de gl.h de votre compilateur.

Maintenant que vous savez comment générer une image vous pouvez soit lire un fichier bmp, jpg, png.. et envoyer les données image à opengl, soit générer vous même une image et l'envoyer à opengl.

Pour appliquer votre texture à une matière, il suffit d'activer le mode texture 2D dans opengl, et de l'appeler avec la fonction, glBindTexture();. Il faut aussi faire correspondre, à chaque sommet(vertex) le sommet de la texture avec glTexCoord2f(); comme ci-dessous. Une texture est forcément rectangulaire, elle a donc quatre sommets.

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texture);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);glVertex2f(0,0);
glTexCoord2f(0, 1);glVertex2f(0,1);
glTexCoord2f(1, 1);glVertex2f(1,1);
glTexCoord2f(1, 0);glVertex2f(1,0);
glEnd();

Là votre cube est recouvert de votre texture. Vous voyez c'est super simple.

Pour vous assurer d'avoir bien compris ce chapitre, vous pouvez générer un damnier noir et blanc. Cet exercice est assez simple et si vous réussissez c'est que vous avez tout compris. Par la suite il est possible et très puissant de générer des textures de bois, de carrelage etc.. soit même.

textures avec glu

Nous avons vu dans un chapitre antérieur les formes avec glu. Il est possible d'appliquer une texture à ces formes. La fonction gluQuadricTexture(pObj, GL_TRUE); existe pour cette raison, avec le pointeur d'objet en parametre 1, et l'activation en second (on peut donc le desactiver avec GL_FALSE). Appelez donc cette fonction en initialisation.

 
Retour
contact: ultrafil [AT] fr.st